外观
USACO 2024 December Contest, Bronze
[USACO24DEC] Roundabount Rounding B
题目描述
奶牛 Bessie 回到学校了!她开始做她的数学作业,在作业中她被要求将正整数四舍五入到
要将一个正整数
如果
然后,Bessie 将从右侧开始直至第
例如,如果 Bessie 想要将
但是,如果 Bessie 将
在看了 Bessie 的作业后,Elsie 认为她已经发明了一种新的舍入方式:链式舍入。要链式舍入到最接近的
Bessie 认为 Elsie 是错误的,但她太忙于数学作业,无法确认她的怀疑。她请你计算出存在多少个不小于
输入格式
你需要回答多个测试用例。
输入的第一行包含一个整数
每个测试用例的输入仅有一行,包含一个整数
输出格式
输出
输入输出样例 #1
输入 #1
4
1
100
4567
33661
2
3
4
5
2
3
4
5
输出 #1
0
5
183
601
2
3
4
2
3
4
说明/提示
样例解释
考虑样例中的第二个测试用例。
在第三个测试用例中,
测试点性质
- 测试点 1:样例。
- 测试点 2-4:
。 - 测试点 5-7:
。 - 测试点 8-13:没有额外限制。
代码案例
c++
#include"iostream"
#include"algorithm"
using namespace std;
const int maxn = 1e6 + 5;
int a[maxn];
int n,t,tot;
int round(int x, int target) { // x 四舍五入到 target 位
if(x % target >= target / 2) return x + target - x % target;
return x - x % target;
}
int chain_round(int x, int target) { // 链式舍入
for(int i = 10; i <= target; i *= 10) x = round(x, i);
return x;
}
void init() {
int i,j=0,target;
for(i = 2; i <= 1e6; ++i) {
target = 1;
while(target < i) target *= 10;//10^p
if(round(i, target) != chain_round(i, target)){
a[i]=a[i-1]+1;
}else{
a[i]=a[i-1];
}
}
}
//void print(){
// int i,j=0,target;
// for(i = 2; i <= 1e6; ++i) {
// target = 1;
// while(target < i) target *= 10;
// if(round(i, target) != chain_round(i, target))a[t++]=i;
// }
// for(i=0;i<100;i++){
// cout<<a[i]<<endl;
// }
//}
int main() {
init();
// print();
cin>>t;
while(t--) {
cin>>n;
cout<<a[n]<<endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
c++
const int a[] = {0, 45, 445, 4445, 44445, 444445, 4444445, 44444445, 444444445};
const int b[] = {0, 49, 499, 4999, 49999, 499999, 4999999, 49999999, 499999999};
int n, t;
int main() {
cin>>t;
while(t--) {
cin>>n;
int ans = 0;
for(int i = 1; i <= 8; ++i) {
if(n >= b[i]) ans += b[i] - a[i] + 1;
else if(n >= a[i]) ans += n - a[i] + 1;
}
cout<<ans<<endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
经验
markdown
- 0.仔细看题,把案例全部看懂。
- 1.铜牌的题从循环模拟(暴力枚举)的角度去做。(一维数组、二维数组)
- 2.计算时间复杂度去判断我们的模拟过程是否合理。
- 3.如果不合理,需要考虑空间换时间,利用好数组前缀和/前缀积/占位计数等。
- 4.如果时间复杂度连最基本的一层for都满足不了,那么结果数据一定有规律或者利用公式去解决O(1),可以打表观察。
- 5.考虑数据类型是否会溢出。1
2
3
4
5
6
2
3
4
5
6
[USACO24DEC] Farmer John's Cheese Block B
题目描述
Farmer John 有一块立方体形状的奶酪,它位于三维坐标空间中,从
对于每次更新操作,FJ 将从整数坐标
在每次更新后,输出 FJ 可以将一个
输入格式
输入的第一行包含
以下
输出格式
在每次更新操作后,输出一个整数,为所求的方案数。
输入输出样例 #1
输入 #1
2 5
0 0 0
1 1 1
0 1 0
1 0 0
1 1 01
2
3
4
5
6
2
3
4
5
6
输出 #1
0
0
1
2
51
2
3
4
5
2
3
4
5
说明/提示
样例解释
在前三次更新操作后,

测试点性质
- 测试点 1:样例。
- 测试点 2-4:
且 。 - 测试点 5-7:
且 。 - 测试点 8-16:没有额外限制。
代码案例
c++
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1001;
int x[MAXN][MAXN], y[MAXN][MAXN], z[MAXN][MAXN], n, q, a, b, c, ans = 0;
int main() {
cin >> n >> q;
for (int i = 1; i <= q; i++) {
cin >> a >> b >> c;
// 判断的代码
if (++x[a][b] == n) ans++;
if (++y[a][c] == n) ans++;
if (++z[b][c] == n) ans++;
cout << ans << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[USACO24DEC] It's Mooin' Time B
题目描述
Farmer John 正在试图向 Elsie 描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。他说「竞赛中我最喜欢的部分是 Bessie 说 『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。
Elsie 仍然不理解,所以 Farmer John 将竞赛以文本文件形式下载,并试图解释他的意思。竞赛被定义为一个长度为
然而,Farmer John 的下载可能损坏,文本文件可能存在至多一个字符与原始文件不同。将可能的误差考虑在内,输出所有可能是 Bessie 发出的哞叫,按字典序顺序排序。
输入格式
输入的第一行包含
第二行包含一个长度为
输出格式
输出可能是 Bessie 发出的哞叫的数量,以下是按字典序排序的哞叫列表。每行输出一种哞叫。
输入输出样例 #1
输入 #1
10 2
zzmoozzmoo1
2
2
输出 #1
1
moo1
2
2
输入输出样例 #2
输入 #2
17 2
momoobaaaaaqqqcqq1
2
2
输出 #2
3
aqq
baa
cqq1
2
3
4
2
3
4
输入输出样例 #3
输入 #3
3 1
ooo1
2
2
输出 #3
25
aoo
boo
coo
doo
eoo
foo
goo
hoo
ioo
joo
koo
loo
moo
noo
poo
qoo
roo
soo
too
uoo
voo
woo
xoo
yoo
zoo1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
说明/提示
样例 #1 解释
在这个样例中,任何字符变化都不会影响答案。唯一 Bessie 可能发出的哞叫是
样例 #2 解释
在这个样例中,位置
测试点性质
- 测试点 1-3:样例。
- 测试点 4-8:
。 - 测试点 9-13:没有额外限制。
代码案例
思路
注意到 n≤20000,考虑直接暴力。每次枚举合法的(*c*i*=*c*j*) *ci* 和 c**j,然后对「竞赛」字符串进行判断。
我们遍历查找每一个「哞哞叫」字符串在「竞赛」字符串中出现了多少次:
- 如果出现次数大于等于 F,那么这个「哞哞叫」字符串就是正确的。
- 如果出现次数刚好等于 F−1,那么考虑「竞赛」字符串损坏了。我们再遍历一次「竞赛」字符串,如果修改一个之前没有用过的字符可以变成这个「哞哞叫」字符串,那么这个「哞哞叫」字符串就是正确的。
该算法时间复杂度为 O(m2N),其中 m=26。
c++
#include"iostream"
#include"algorithm"
using namespace std;
int n,f;
string s;
string ss[20005];
bool check(string s2){
int i,j,k=0;
int b[20005]={0};
for(i=0;i<s.size()-2;i++){
if(s[i]==s2[0]&&s[i+1]==s2[1]&&s[i+2]==s2[2]){
k++;
b[i]=b[i+1]=b[i+2]=1;//当前字符已被使用
}
}
if(k>=f){
return true;
}else if(k+1==f){
for(i=0;i<s.size()-2;i++){
if(s[i]==s2[0]&&(s[i+1]==s2[1]&&b[i+2]==0 || s[i+2]==s2[2]&&b[i+1]==0)) return true;
if(b[i]==0 && s[i+1]==s2[1] && s[i+2]==s2[1]) return true;
}
}
return false;
}
int main(){
char i,j;
int ans=0,k=0;
cin>>n>>f>>s;
for(i='a';i<='z';i++){
string s2="";
s2+=i;
for(j='a';j<='z';j++){
if(i==j){
continue;
}
s2+=j;
s2+=j;
// cout<<s2<<endl;
if(check(s2)){
ans++;
ss[k++]=s2;
}
s2="";
s2+=i;
}
}
cout<<ans<<endl;
for(i=0;i<k;i++){
cout<<ss[i]<<endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
